package sprint2;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

/**
 * Gevechtschip waarmee je andere Gevechtschepen kunt aanvallen.
 * @author Marco Schultewolter
 *
 */
public class BattleShip extends Spaceship implements Serializable {

	private double state;
	private BattleShip[] battleShips;
	private BattleShipGun[] guns;

	/**
	 * Constructor van BattleShip
	 * @param state State of BattleShip
	 * @param defense Hoe groot de defense van de gevechtschip is
	 * @param ships Andere Gevechtschepen, die je door dit Gevechtschip kunt bereiken.
	 */
	public BattleShip(String naam, String filename, int nr, int con1, int con2,
			int con3, int con4, int con5, int object, int monster, double state, BattleShip[] ships, BattleShipGun[] guns) {
		super(naam, filename, nr, con1, con2, con3, con4, con5, object,
				monster);
		this.state = state;
		this.battleShips = ships;
		this.guns =guns;
	}

	public double getState() {
		return state;
	}

	public boolean isKapot() {
		return (state == 0);
	}

	private BattleShip getRandomBattleShip() { 
		if (Math.random()>= 0.5) { //50 procent kans, dat je een BattleShip ziet.
			int rnd = (int)((Math.random() * (battleShips.length)));
			return battleShips[rnd];
		}
		return null;
	}
	

	/**
	 * Probeert, een BattleShip aan te vallen.
	 */
	public void tryToAttack(){
		BattleShip b = getRandomBattleShip();
		if (null == b || b.isKapot()) {
			System.out.println("Je ziet momenteel geen Gevechtschip die je kunt aanvallen...");
		} else {
			attackBattleShip(b);
		}
		boolean allemaalKapot = true;
		for (int i = 0; i < battleShips.length; i++) {
			if (!battleShips[i].isKapot())
				allemaalKapot = false;
		}
		
		if (allemaalKapot)
			System.out.println("Jiiippiiiii! Je hebt hun allemaal verslagen!");
	}

	/**
	 * Mindert de state van dit gevechtschip
	 * @param hoeveel Hoeveel zal er afgetrokken worden.
	 */
	public void decreaseState(double hoeveel) {
		if (state <= hoeveel) {
			state = 0;
		} else {
			state -= hoeveel;
		}
	}

	/**
	 * Laat de gebruiker een gun kiezen.
	 * @return De gun, die zal worden gebruikt.
	 */
	private BattleShipGun kiesGun() {
		System.out.println("\nMet welke gun wil je de gevechtschip aanvallen?");
		for (int i = 0; i<guns.length; i++) {
			//System.out.printf(" %2d: " + guns[i] + "\n", i);
			System.out.println(i + " " + guns[i]);
		}
		Scanner s = new Scanner(System.in);
		int keuze;
		do {
			System.out.print("\nKeuze: ");
			keuze = s.nextInt();
		} while (keuze < 0 || keuze >= guns.length);
		return guns[keuze];
	}

	public BattleShipGun[] getGuns() {
		return guns;
	}
	
	/**
	 * Valt een bepaalde BattleShip op een toevallig manier een keer aan.
	 * (Wordt eigenlijk alleen gebruikt, om de gebruiker aan te vallen)
	 * @param bs Welk BattleShip angevallen zal worden.
	 * @return true, als hij heeft geraakt
	 */
	public boolean randomAttack(BattleShip bs) {
		BattleShipGun g = bs.getGuns()[(int)(Math.random() * guns.length)];
		return g.shoot(bs);
	}

	/**
	 * Een andere BattleShip aanvallen.
	 * @param b De BattleShip, die er aangevallen zal worden.
	 */
	private void attackBattleShip(BattleShip b) {
		boolean einde = false;

		System.out.println("\nJe ziet een Gevechtschip!\n");
		while (!einde) {
			System.out.print("\nToestand van jouw gevechtschip:  ");
			System.out.printf("%4d Statepoints\n", (int)this.getState());
			System.out.print("Toestand van vijandelijke schip: ");
			System.out.printf("%4d Statepoints\n", (int)b.getState());

			if (this.isKapot()) {
				System.out.println("Jouw gevechtschip is kapot! Je kunt niet anvallen!");
				return;
			}
			Scanner s = new Scanner(System.in);

			int[] toegestaan = {0, 1};
			int keuze;
			do {
				System.out.println("\nWat wil je nu doen?");
				System.out.println("0\tVluchten");
				System.out.println("1\tAanvallen");
				System.out.print(" => ");
				keuze = s.nextInt();
			} while ( Arrays.binarySearch(toegestaan, 0, toegestaan.length, keuze) < 0 );
			switch (keuze)
			{
			case 0:  // vluchten
				if (Math.random() <= 0.5){  // 50% kans, dat het vijandelijke schip je aanvalt als je wilt vluchten
					System.out.println("Het is je gelukt om te vluchten.");
					einde = true;
				} else {
					System.out.println("Het is je niet snel genoeg gelukt om te vluchten. Het vijandelijke schip heeft het nog geprobeert je aan te vallen.");
					if (b.randomAttack(this)) {
						System.out.println("Het vijandelijke gevechtschip heeft geraakt!");
						System.out.println("Nieuwe toestand: " + getState() + " Statepoints");
					} else {
						System.out.println("Het vijandelijke gevechtschip heeft niet geraakt.");
					}
				}
				einde = true;
				break;
			case 1:  // aanvallen
				BattleShipGun g = kiesGun();
				if (g.shoot(b)) {
					System.out.println("Jippii!! Geraakt!");
				} else {
					System.out.println("Jammer! Je hebt niet geraakt!");
				}
				if (b.randomAttack(this)) {
					System.out.println("Het vijandelijke gevechtschip heeft geraakt!");
				} else {
					System.out.println("Het vijandelijke gevechtschip heeft niet geraakt.");
				}
				if (b.isKapot()) {
					System.out.println("De vijandelijke gevechtschip is kapot!");
					einde = true;
				}
				break;
			}
		}
	}
}
